﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

/*
* 10.fseek(文件流，移动字节，模式)，移动光标位置；
*		模式：SEEK_SET，以文件开头为标准；
*			  SEEK_CUR，以光标当前位置为标准；
*			  SEEK_END，以文件结尾为标准；
* 11.ftell(文件流)，获取光标当前位置，返回值是long；
*
* 13.rewind(文件流)，重置光标到文件起始位置；
*/

//main163&164&165&166：文本文件的文本流操作光标位置
int main163()
{
	char* arr = "hello world";
	FILE* fp = fopen("../../../file/FileCursorOperation.txt", "w");
	if (!fp)
	{
		return -1;
	}

	fputs(arr, fp);

	fclose(fp);

	system("pause");
	return EXIT_SUCCESS;
}
int main164(void)
{
	FILE* fp = fopen("../../../file/FileCursorOperation.txt", "r");
	if (!fp)
	{
		return -1;
	}

	//1.改变读取文件信息的位置，原来是从首字母h读取，现在换成从w这里读取文本了；hello world
		//SEEK_SET，文件信息的起始位置。6是指，光标向后移动6个字节，即从第7个字节w开始读。
	//fseek(fp, 6, SEEK_SET);
	//2.SEEK_END，文件信息的末尾位置。-5，从末尾处向前移动5个字节，即读取world；
	//fseek(fp, -5, SEEK_END);

	char ch;
	while ((ch = getc(fp)) != EOF)
	{
		//3.当前光标位置，向后移动5个字节。即刚开始读取h，然后向后移动5个字节，从第6个字节读取，会读取到w。下次再
			//移动5个，就到文件末尾了，直接就不进入循环了。起始位置是h，移动5个，从第6个读取w。
		//fseek(fp, 2, SEEK_CUR);//5-->2
		printf("%c", ch);//world-->world-->hw-->hlwl
		int p = ftell(fp);
		printf("4.此时光标所在的位置为：%d\n", p);//h1 e2 l3 ...
		/*h4.此时光标所在的位置为：1
		e4.此时光标所在的位置为：2
		l4.此时光标所在的位置为：3
		l4.此时光标所在的位置为：4
		o4.此时光标所在的位置为：5
		 4.此时光标所在的位置为：6
		w4.此时光标所在的位置为：7
		o4.此时光标所在的位置为：8
		r4.此时光标所在的位置为：9
		l4.此时光标所在的位置为：10
		d4.此时光标所在的位置为：11
		*/
	}

	fclose(fp);

	return 0;
}
int main165(void)
{
	FILE* fp = fopen("../../../file/FileCursorOperation.txt", "r");
	if (!fp)
	{
		return -1;
	}

	char buf[20];
	while (!feof(fp))
	{
		fgets(buf, 20, fp);
		printf("%s\n", buf);//hello world
		//6.%ld，是long类型输出，ftell的返回值是long类型；行读取的光标位置，是长度-1，为索引19。
		printf("5.行读取文本信息，读完一行后光标所在的位置：%ld\n", ftell(fp));//hello world hello w  19
		//5.行读取文本信息，读完一行后光标所在的位置：11
	}


	fclose(fp);

	return 0;
}
int main166(void)
{
	FILE* fp = fopen("../../../file/FileCursorOperation.txt", "r");
	if (!fp)
	{
		return -1;
	}

	char buf[20];
	for (int i = 0; i < 5; i++)
	{
		fgets(buf, 20, fp);
		printf("%s\n", buf);//hello world hello w
		printf("7.行读取文本信息，读完一行后光标所在的位置：%ld\n", ftell(fp));//hello world hello w  19
		//7.行读取文本信息，读完一行后光标所在的位置：19
	}
	rewind(fp);
	//12.当光标回到0时，再用fseek设置移动负值，光标位置还是不变。
	fseek(fp, -5, SEEK_SET);
	//9.由结果可知，光标的初始位置为0，和索引一样，并不是初始位置为1。
	printf("8.读取5行文本信息后，将光标重置，则此时光标位置为：%ld", ftell(fp));//0-->0

	fclose(fp);
	return 0;
}